#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSerialPortInfo>
#include <QDebug>
#include <QMap>
#include <QMessageBox>
#include <QDateTime>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    zxConfig(new ZxConfig(this))
{
    /* 组件安装 */
    ui->setupUi(this);

    /* 成员内存托管 */
    serialPort = new QSerialPort(this);

    /* 固定窗口大小 */
    // setMinimumSize(QSize(773, 510));
    // setMaximumSize(QSize(773, 510));

    /* 手动关联串口对象 的 ready 信号 和 自定义的 ready  */
    connect(serialPort, SIGNAL(readyRead()), this, SLOT(serialPortReadyRead_slot()));

    /* 获取所有串口名称, 并显示在串口号选择的 combox 上 */
    QStringList serialNamePort;
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        serialNamePort << info.portName();
    }
    ui->comboBox->addItems(serialNamePort);
}

MainWindow::~MainWindow()
{
    delete ui;
}

// 打开串口
void MainWindow::on_pushButton_clicked()
{

    QMap<QString, QSerialPort::BaudRate> buadMap = {
                                                   {"1200", QSerialPort::Baud1200}, {"2400", QSerialPort::Baud2400},
                                                   {"4800", QSerialPort::Baud4800}, {"9600", QSerialPort::Baud9600},
                                                   {"19200", QSerialPort::Baud19200},{"115200", QSerialPort::Baud115200}
                                                 };
    QMap<QString, QSerialPort::DataBits> dataBitsMap = {
                                                   {"5", QSerialPort::Data5}, {"6", QSerialPort::Data6},
                                                   {"7", QSerialPort::Data7}, {"8", QSerialPort::Data8}
                                                  };
    QMap<QString, QSerialPort::StopBits> stopBitsMap = {
                                                   {"1", QSerialPort::OneStop}, {"1.5", QSerialPort::OneAndHalfStop},
                                                   {"2", QSerialPort::TwoStop}
                                                  };
    QMap<QString, QSerialPort::Parity> parityMap = {
                                                   {"None", QSerialPort::NoParity}, {"Even", QSerialPort::EvenParity},
                                                   {"Odd", QSerialPort::OddParity}
                                                  };

    QSerialPort::BaudRate baudRate;//定义波特率
    QSerialPort::DataBits dataBits;//定义数据位
    QSerialPort::StopBits stopBits;//定义停止位
    QSerialPort::Parity   patity;  //定义校验位

    /* 获取串口号 */
    QString portName = ui->comboBox->currentText();
    if(portName.isEmpty())
    {
        QMessageBox::information(this, "提示", "请选择端口号");
        return;
    }

    /* 设置串口对象参数 */
    baudRate = buadMap[ui->comboBox_2->currentText()];
    dataBits = dataBitsMap[ui->comboBox_3->currentText()];
    stopBits = stopBitsMap[ui->comboBox_4->currentText()];
    patity   = parityMap[ui->comboBox_5->currentText()];

    serialPort->setPortName(portName);
    serialPort->setBaudRate(baudRate);
    serialPort->setDataBits(dataBits);
    serialPort->setStopBits(stopBits);
    serialPort->setParity(patity);

    /* 条件均满足, 先关闭原先串口, 再开串口 */
    // MainWindow::on_pushButton_2_clicked();
    if(serialPort->open(QIODevice::ReadWrite) == true)
    {
        ui->pushButton->setDisabled(true);
    }
    else
    {
        QMessageBox::information(this, "提示", "打开串口失败");
    }
}

// 关闭串口
void MainWindow::on_pushButton_2_clicked()
{
    serialPort->close();
    ui->pushButton->setDisabled(false);
}

// 串口接收函数
void MainWindow::serialPortReadyRead_slot()
{
    QString buff;

    /* 回显时间 */
    if(ui->checkBox_3->isChecked())
    {
        buff = QDateTime::currentDateTime().toString("[hh:mm:ss.zzz]");
    }

    buff += "收: " + QString(serialPort->readAll());
    ui->plainTextEdit->appendPlainText(buff);
}

// 发送按钮
void MainWindow::on_pushButton_3_clicked()
{
    QString content = ui->plainTextEdit_2->toPlainText();
    if(!content.isEmpty())
    {
        /* 回显, 则显示到发送框 */
        if(ui->checkBox_4->isChecked())
        {
            /* 加上时间 */
            if(ui->checkBox_3->isChecked())
            {
                ui->plainTextEdit->appendPlainText(QDateTime::currentDateTime().toString("[hh:mm:ss.zzz]") + "发: " + content);
            }
            else
            {
                ui->plainTextEdit->appendPlainText("发: " + content);
            }
        }
        serialPort->write(content.toLocal8Bit().data());
    }
}

void MainWindow::on_pushButton_4_clicked()
{
    ui->plainTextEdit->clear();
}
